/***************************************************************************
 创建者: 华磊
 开始时间: 2019.7.10
 copyright: (C) 深圳市华友高科有限公司
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2020.5.8 类的具体实现代码编写
 ***************************************************************************/
#include "reflecteditdialog.h"
#include "ui_reflecteditdialog.h"

#include <QMessageBox>
#include "mapscene.h"


ReflectEditDialog::ReflectEditDialog(MapDelegate *mapDelegateIn, MapScene *sceneIn, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ReflectEditDialog)
{
    ui->setupUi(this);
    mapDelegate=mapDelegateIn;
    scene=sceneIn;

    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(timeroutslot()));

    model_reflectDebugInfo= new QStandardItemModel();
    model_reflectLaserPointInfo= new QStandardItemModel();
    model_allReflectMarksInfo= new QStandardItemModel();

    connect(ui->tableView_detectedLaserPoints,SIGNAL(clicked(QModelIndex)),this,SLOT( showChooseLaserPoint_slot() ));

}

ReflectEditDialog::~ReflectEditDialog()
{
    delete ui;
}

int ReflectEditDialog::showDialog()
{
    move(1000,0);
    timer->start(200);
    show();
    updateReferencePointShow();
    return 1;
}

int ReflectEditDialog::hideDialog()
{
    timer->stop();
    hide();
    return 1;
}

void ReflectEditDialog::getAllReflectMarks()
{
    mapDelegate->getAllReferenceMarks(allReflectMarks);
    displayAllReflectMarks(allReflectMarks);
}

void ReflectEditDialog::useUserPoint_slot(double x, double y, double r)
{
//    double tmpX,tmpY,tmpA;
//    scene->getWorldPosition(tmpX,tmpY,tmpA);
    ui->lineEdit_referenceMark_x->setText(QString::number(x,'f',3));
    ui->lineEdit_referenceMark_y->setText(QString::number(y,'f',3));
    ui->comboBox_referenceMark_usePointSource->setCurrentIndex(0);
}

void ReflectEditDialog::showChooseLaserPoint_slot()
{
    int row= ui->tableView_detectedLaserPoints->currentIndex().row();
    QAbstractItemModel *model = ui->tableView_detectedLaserPoints->model();
    QModelIndex index = model->index(row,1);//选中行第一列的内容
    QVariant data = model->data(index);
    ui->lineEdit_referenceMark_x->setText(data.toString());

    QModelIndex index_name = model->index(row,2);
    QVariant data_name = model->data(index_name);
    ui->lineEdit_referenceMark_y->setText(data_name.toString());

//    ui->lineEdit_referenceMark_r->setText("");

    ui->comboBox_referenceMark_usePointSource->setCurrentIndex(1);


}

void ReflectEditDialog::timeroutslot()
{

    //获取调试信息
    if(ui->checkBox_isUpdateReflectDebugInfo->isChecked()
            || ui->checkBox_isUpdateDetectedLaserPoint->isChecked())
    {

        mapDelegate->getReflectDebugInfo(matchDebugInfoOut);
    }
    //更新reflect调试信息显示
    if(ui->checkBox_isUpdateReflectDebugInfo->isChecked())
    {
        displayReflectDebugInfo(matchDebugInfoOut);
    }
    //更新显示激光点信息
    if(ui->checkBox_isUpdateDetectedLaserPoint->isChecked())
    {
        static int tmpCount=0;
        tmpCount++;
        if(tmpCount>10)
        {
            tmpCount=0;
            displayReflectLaserPointInfo(matchDebugInfoOut.laserMarks);
        }

    }


}

void ReflectEditDialog::on_pushButton_getAllReflectMarks_clicked()
{
    getAllReflectMarks();

}

void ReflectEditDialog::on_pushButton_saveAllReflectMarksToFile_clicked()
{
    std::string tmpMapName;
    mapDelegate->getCurrentMapName(tmpMapName);
    int returnFLag;
    mapDelegate->saveReferenceMarkToFile(tmpMapName,returnFLag);
    if(1==returnFLag)
    {
        on_pushButton_getAllReflectMarks_clicked();
        on_checkBox_isShowAllReflectMarks_clicked(true);
        QMessageBox message(QMessageBox::Question, "提示", "保存所有标记点成功！"
                            , QMessageBox::Yes , NULL);
        if(message.exec() == QMessageBox::Yes)
        {
            return;
        }
    }
    else
    {
        QMessageBox message(QMessageBox::Question, "提示", "保存标记点失败！"
                            , QMessageBox::Yes , NULL);
        if(message.exec() == QMessageBox::Yes)
        {
            return;
        }
    }
}

void ReflectEditDialog::on_pushButton_deleteSelectedMark_clicked()
{
    QMessageBox message(QMessageBox::Question, "提示", "是否删除选中的标记点！"
                        , QMessageBox::Yes|QMessageBox::No , NULL);
    if(message.exec() == QMessageBox::No)
    {
        return;
    }
    int currentLine=ui->tableView_allReflectMarksInfo->currentIndex().row();
    if(currentLine<0 || currentLine>=allReflectMarks.size())
    {
        qDebug()<<"error, on_pushButton_deleteSelectedMark_clicked currentLine"<<currentLine;
        return ;
    }

//    QAbstractItemModel *model = ui->tableView_stationInfo->model ();
//    QModelIndex index = model->index(row,0);//选中行第一列的内容
//    QVariant data = model->data(index);
//    ui->lineEdit_originId->setText(data.toString());

    int returnFlag;
    mapDelegate->deleteReferenceMarkInMap(allReflectMarks[currentLine].uniqId,returnFlag);
    if(1==returnFlag)
    {
        //save
        std::string tmpMapName;
        mapDelegate->getCurrentMapName(tmpMapName);
        int returnFLag;
        mapDelegate->saveReferenceMarkToFile(tmpMapName,returnFLag);

        on_pushButton_getAllReflectMarks_clicked();
        emit displayAllReflectMarksInMap_signal(false);
        emit displayAllReflectMarksInMap_signal(true);
        qDebug()<<"delete ref point sucess";
    }

}

void ReflectEditDialog::on_pushButton_addReferenceMark_clicked()
{
    ReflectMarkInfo markIn;
    int returnFlag;
    markIn.pose_x=ui->lineEdit_referenceMark_x->text().toDouble();
    markIn.pose_y=ui->lineEdit_referenceMark_y->text().toDouble();
//    markIn.pose_r=ui->lineEdit_referenceMark_r->text().toDouble()*M_PI/180.0;
    markIn.pose_r=0;
    markIn.groupId=0;
    markIn.uniqId=ui->lineEdit_referenceMark_uniqId->text().toInt();
    markIn.isPlaneMark=ui->comboBox_referenceMark_isPlaneMark->currentIndex();
    markIn.typeId=ui->comboBox_referenceMarkTypeId->currentIndex();
    mapDelegate->addReferenceMarkToMap(markIn,returnFlag);
    if(1==returnFlag)
    {
        on_pushButton_getAllReflectMarks_clicked();
        on_checkBox_isShowAllReflectMarks_clicked(true);
        //save
        std::string tmpMapName;
        mapDelegate->getCurrentMapName(tmpMapName);
        int returnFLag;
        mapDelegate->saveReferenceMarkToFile(tmpMapName,returnFLag);
        QMessageBox message(QMessageBox::Question, "提示", "添加标记点成功！"
                            , QMessageBox::Yes , NULL);
        if(message.exec() == QMessageBox::Yes)
        {
            updateReferencePointShow();

            return;
        }
    }
    else
    {
        QMessageBox message(QMessageBox::Question, "提示", "添加标记点失败，标记类型不一致！"
                            , QMessageBox::Yes , NULL);
        if(message.exec() == QMessageBox::Yes)
        {
            return;
        }
    }

}



int ReflectEditDialog::displayReflectDebugInfo(ReflectDebugInfo &infoIn)
{

    model_reflectDebugInfo->clear();
//    for(int i=0;i<itemList_reflectDebugInfo.size();i++)
//    {
//        delete itemList_reflectDebugInfo[i];
//    }
    itemList_reflectDebugInfo.clear();
    //定义item
    QStandardItem* item = 0;

    item = new QStandardItem("匹配结果");
    model_reflectDebugInfo->setItem(0,0,item);
    itemList_reflectDebugInfo.append(item);
    if(1==infoIn.isMatchSucess)
    {
        item = new QStandardItem("成功");
    }
    else
    {
        item = new QStandardItem("失败");
    }
    itemList_reflectDebugInfo.append(item);

    model_reflectDebugInfo->setItem(0,1,item);

    item = new QStandardItem("位置x");
    model_reflectDebugInfo->setItem(1,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.pose_x,'f',3));
    model_reflectDebugInfo->setItem(1,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("位置y");
    model_reflectDebugInfo->setItem(2,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.pose_y,'f',3));
    model_reflectDebugInfo->setItem(2,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("位置r");
    model_reflectDebugInfo->setItem(3,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.pose_r*180.0/M_PI,'f',3));
    model_reflectDebugInfo->setItem(3,1,item);
    itemList_reflectDebugInfo.append(item);


    item = new QStandardItem("初始激光点数");
    model_reflectDebugInfo->setItem(4,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.initialLaserMarkCount));
    model_reflectDebugInfo->setItem(4,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("初始参考点数");
    model_reflectDebugInfo->setItem(5,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.initialReferenceMarkCount));
    model_reflectDebugInfo->setItem(5,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("匹配对数");
    model_reflectDebugInfo->setItem(6,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.referenceMarks.size()));
    model_reflectDebugInfo->setItem(6,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("位置修正");
    model_reflectDebugInfo->setItem(7,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.isCorrectSucess));
    model_reflectDebugInfo->setItem(7,1,item);
    itemList_reflectDebugInfo.append(item);


    item = new QStandardItem("修正计数");
    model_reflectDebugInfo->setItem(8,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.correctCount));
    model_reflectDebugInfo->setItem(8,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("修正x");
    model_reflectDebugInfo->setItem(9,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.correctPositionOffset.x,'f',3));
    model_reflectDebugInfo->setItem(9,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("修正y");
    model_reflectDebugInfo->setItem(10,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.correctPositionOffset.y,'f',3));
    model_reflectDebugInfo->setItem(10,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("修正r");
    model_reflectDebugInfo->setItem(11,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.correctPositionOffset.rotate*180.0/M_PI,'f',3));
    model_reflectDebugInfo->setItem(11,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("里程误差x");
    model_reflectDebugInfo->setItem(12,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.odomAccumulatedError.x,'f',3));
    model_reflectDebugInfo->setItem(12,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("里程误差y");
    model_reflectDebugInfo->setItem(13,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.odomAccumulatedError.y,'f',3));
    model_reflectDebugInfo->setItem(13,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("里程误差r");
    model_reflectDebugInfo->setItem(14,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.odomAccumulatedError.rotate*180.0/M_PI,'f',3));
    model_reflectDebugInfo->setItem(14,1,item);
    itemList_reflectDebugInfo.append(item);



    item = new QStandardItem("搜索范围x");
    model_reflectDebugInfo->setItem(15,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.positionError.x,'f',3));
    model_reflectDebugInfo->setItem(15,1,item);

    item = new QStandardItem("搜索范围y");
    model_reflectDebugInfo->setItem(16,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.positionError.y,'f',3));
    model_reflectDebugInfo->setItem(16,1,item);

    item = new QStandardItem("搜索范围r");
    model_reflectDebugInfo->setItem(17,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.positionError.rotate*180.0/M_PI,'f',3));
    model_reflectDebugInfo->setItem(17,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("最小耗时(ms)");
    model_reflectDebugInfo->setItem(18,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.minConsumed/1000,'f',3));
    model_reflectDebugInfo->setItem(18,1,item);
    itemList_reflectDebugInfo.append(item);



    item = new QStandardItem("当前耗时(ms)");
    model_reflectDebugInfo->setItem(19,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.currentConsumed/1000,'f',3));
    model_reflectDebugInfo->setItem(19,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("最大耗时(ms)");
    model_reflectDebugInfo->setItem(20,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.maxConsumed/1000,'f',3));
    model_reflectDebugInfo->setItem(20,1,item);
    itemList_reflectDebugInfo.append(item);


    item = new QStandardItem("激光最低光强");
    model_reflectDebugInfo->setItem(21,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.minumIntensity));
    model_reflectDebugInfo->setItem(21,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("激光minRange");
    model_reflectDebugInfo->setItem(22,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.minLaserRange));
    model_reflectDebugInfo->setItem(22,1,item);
    itemList_reflectDebugInfo.append(item);

    item = new QStandardItem("激光maxRange");
    model_reflectDebugInfo->setItem(23,0,item);
    itemList_reflectDebugInfo.append(item);
    item = new QStandardItem(QString::number(infoIn.maxLaserRange));
    model_reflectDebugInfo->setItem(23,1,item);
    itemList_reflectDebugInfo.append(item);


    ui->tableView_reflectDebugInfo->setModel(model_reflectDebugInfo);
    ui->tableView_reflectDebugInfo->resizeColumnToContents(0);
    ui->tableView_reflectDebugInfo->resizeColumnToContents(1);
    ui->tableView_reflectDebugInfo->resizeColumnToContents(2);
    ui->tableView_reflectDebugInfo->show();
}

int ReflectEditDialog::displayReflectLaserPointInfo(std::vector<LaserMarkInfo> laserMarks)
{

    model_reflectLaserPointInfo->clear();
    //定义item
    QStandardItem* item = 0;
    item = new QStandardItem("ID");
    model_reflectLaserPointInfo->setItem(0,0,item);
    item = new QStandardItem("X");
    model_reflectLaserPointInfo->setItem(0,1,item);
    item = new QStandardItem("Y");
    model_reflectLaserPointInfo->setItem(0,2,item);

    for(int i=0;i<laserMarks.size();i++)
    {
        item = new QStandardItem(QString::number(i));
        model_reflectLaserPointInfo->setItem(i+1,0,item);
        item = new QStandardItem(QString::number(laserMarks[i].pose_x,'f',3));
        model_reflectLaserPointInfo->setItem(i+1,1,item);
        item = new QStandardItem(QString::number(laserMarks[i].pose_y,'f',3));
        model_reflectLaserPointInfo->setItem(i+1,2,item);
    }

    ui->tableView_detectedLaserPoints->setModel(model_reflectLaserPointInfo);
    ui->tableView_detectedLaserPoints->resizeColumnToContents(0);
    ui->tableView_detectedLaserPoints->resizeColumnToContents(1);
    ui->tableView_detectedLaserPoints->resizeColumnToContents(2);
    ui->tableView_detectedLaserPoints->show();
}

int ReflectEditDialog::displayAllReflectMarks(std::vector<ReflectMarkInfo> &reflectMarksIn)
{
    model_allReflectMarksInfo->clear();

    QStringList labels6 = QObject::trUtf8("标记id,是否平面,类型Id,x,y").simplified().split(",");
    model_allReflectMarksInfo->setHorizontalHeaderLabels(labels6);
//    ui->tableView_stationInfo->setColumnWidth(1,120);

    //定义item
    QStandardItem* item = 0;

//    item = new QStandardItem("标记id");
//    model_allReflectMarksInfo->setItem(0,0,item);
//    item = new QStandardItem("是否平面");
//    model_allReflectMarksInfo->setItem(0,1,item);
//    item = new QStandardItem("类型Id");
//    model_allReflectMarksInfo->setItem(0,2,item);
//    item = new QStandardItem("x");
//    model_allReflectMarksInfo->setItem(0,3,item);
//    item = new QStandardItem("y");
//    model_allReflectMarksInfo->setItem(0,4,item);

    for(int i=0;i<reflectMarksIn.size();i++)
    {
        item = new QStandardItem(QString::number(reflectMarksIn[i].uniqId));
        model_allReflectMarksInfo->setItem(i,0,item);
        item = new QStandardItem(QString::number(reflectMarksIn[i].isPlaneMark));
        model_allReflectMarksInfo->setItem(i,1,item);
        item = new QStandardItem(QString::number(reflectMarksIn[i].typeId));
        model_allReflectMarksInfo->setItem(i,2,item);
        item = new QStandardItem(QString::number(reflectMarksIn[i].pose_x,'f',3));
        model_allReflectMarksInfo->setItem(i,3,item);
        item = new QStandardItem(QString::number(reflectMarksIn[i].pose_y,'f',3));
        model_allReflectMarksInfo->setItem(i,4,item);

    }

    ui->tableView_allReflectMarksInfo->setModel(model_allReflectMarksInfo);
    ui->tableView_allReflectMarksInfo->resizeColumnToContents(0);
    ui->tableView_allReflectMarksInfo->resizeColumnToContents(1);
    ui->tableView_allReflectMarksInfo->resizeColumnToContents(2);
    ui->tableView_allReflectMarksInfo->resizeColumnToContents(3);
    ui->tableView_allReflectMarksInfo->resizeColumnToContents(4);
    ui->tableView_allReflectMarksInfo->show();
}

//void ReflectEditDialog::on_pushButton_copyMapPoint_clicked()
//{
//    double tmpX,tmpY,tmpA;
//    scene->getWorldPosition(tmpX,tmpY,tmpA);
//    ui->lineEdit_referenceMark_x->setText(QString::number(tmpX,'f',3));
//    ui->lineEdit_referenceMark_y->setText(QString::number(tmpY,'f',3));
//}

//void ReflectEditDialog::on_pushButton_copyLaserPoint_clicked()
//{
//    int currentLine=ui->tableView_detectedLaserPoints->currentIndex().row()-1;
//    if(currentLine<0 || currentLine>=matchDebugInfoOut.laserMarks.size())
//    {
//        qDebug()<<"error, on_pushButton_copyLaserPoint_clicked currentLine"<<currentLine;
//        return ;
//    }

//    ui->lineEdit_referenceMark_x->setText(QString::number(matchDebugInfoOut.laserMarks[currentLine].pose_x,'f',3));
//    ui->lineEdit_referenceMark_y->setText(QString::number(matchDebugInfoOut.laserMarks[currentLine].pose_y,'f',3));

//}

void ReflectEditDialog::on_checkBox_isShowAllReflectMarks_clicked(bool checked)
{
    emit displayAllReflectMarksInMap_signal(checked);
}

void ReflectEditDialog::on_checkBox_isShowCalculatedReflectPoint_clicked(bool checked)
{
    mapDelegate->setDisplayCalculatedReferenceMarks(checked);
}

void ReflectEditDialog::on_checkBox_isShowDetectedLaserPoint_clicked(bool checked)
{
    mapDelegate->setDisplayDetectedLaserPoints(checked);
}

void ReflectEditDialog::updateReferencePointShow()
{
    mapDelegate->getAllReferenceMarks(allReflectMarks);
    displayAllReflectMarks(allReflectMarks);
    //
    int tmpMax=0;
    for(int i=0;i<allReflectMarks.size();i++)
    {
        if(allReflectMarks[i].uniqId>tmpMax)
        {
            tmpMax=allReflectMarks[i].uniqId;
        }
    }
    ui->lineEdit_referenceMark_uniqId->setText(QString::number(tmpMax+1));
    ui->lineEdit_referenceMark_x->setText("");
    ui->lineEdit_referenceMark_y->setText("");
//    ui->lineEdit_referenceMark_r->setText("");
}
